/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package TablaDeSimbolos;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Administrador
 */
public class Procedimiento extends Elemento{
    protected ArrayList<ParametroFormal> parametrosFormales;
    protected int etiqueta;
    protected int nivelLexico;
    protected static final int REFERENCIA = 0;
    protected static final int VALOR = 1;

    public Procedimiento(int etiqueta, ArrayList<ParametroFormal> parametrosFormales, int nivelLexico){
        this.etiqueta = etiqueta;
        this.parametrosFormales = parametrosFormales;
        this.nivelLexico = nivelLexico;

        asignarOffsetParametros(parametrosFormales);
    }

    public int getEtiqueta(){
        return etiqueta;
    }

    public int getNivelLexico(){
        return nivelLexico;
    }

    @Override
    public boolean esProcedimiento(){
        return true;
    }


    public void asignarOffsetParametros(ArrayList<ParametroFormal> l){
        ParametroFormal p;
        int off = -3;
        
        for (int x = l.size()-1; x >= 0; x--){
            p = l.get(x);

            if (p.getPasaje() == VALOR){
                off = off - p.getTipo().getCantElem() + 1;
                p.setOffset(off);
                off = off - 1;//p.getTipo().getCantElem();
            }
            else {
                // Los parametros por referencia solo ocupan una posicion de memoria
                p.setOffset(off);
                off = off - 1;
            }
        }
    }

    
    /* La posicion pasada como parametro debe estar entre 1 (para recuperar el primer parametro formal)
     * y la cantidad de elementos del ArrayList parametrosFormales
     * */
    public Elemento getParametro(int pos){

        if (parametrosFormales.size() >= pos){
            return (parametrosFormales.get(pos - 1));
        }

        return null;
    }


    // Retorna la cantidad de memoria utilizada por los parametros
    public int getCantMemoria(){
        int cantMemoria = 0;
        Iterator<ParametroFormal> it = parametrosFormales.iterator();
        ParametroFormal param;

        while (it.hasNext()){
            param = it.next();
            if (param.getPasaje() == VALOR){
                cantMemoria += param.getTipo().getCantElem();
            }
            else{
                cantMemoria += 1;
            }
        }

        return cantMemoria;
    }

    // Retorna la cantidad de celdas de memoria necesarias para almacenar los parametros actuales
    public int getCantidadParametros(){
        return parametrosFormales.size();
    }
}
